home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Region.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-16
|
2KB
|
107 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "Region.h"
#include "Class.h"
#include "Storage.h"
#include "String.h"
#define SIMPLE
//---- Region ------------------------------------------------------------------
Region::Region()
{
size= 0;
rl= 0;
bbox= gRect0;
#ifdef SIMPLE
rl= (Rectangle*)Storage::Alloc(sizeof(Rectangle)*25);
#endif
}
Region::Region(Rectangle &r)
{
size= 1;
rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size);
rl[0]= r;
bbox= r;
}
Region::~Region()
{
size= 0;
SafeDelete(rl);
}
Rectangle *Region::GetAt(int ix)
{
if (ix >= 0 && ix < size)
return &rl[ix];
return 0;
}
void Region::operator=(Region &r)
{
SafeDelete(rl);
size= r.size;
bbox= r.bbox;
rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size);
memcpy(rl, r.rl, sizeof(Rectangle)*size);
}
void Region::Merge(Rectangle r)
{
#ifndef SIMPLE
if (size > 0) {
Rectangle *nrl= (Rectangle*) Alloca(sizeof(Rectangle)*size*4+1);
int i, ns;
for (ns= i= 0; i < size; i++)
ns+= Difference(&nrl[ns], rl[i], r);
size= ns+1;
SafeDelete(rl);
rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*size+100);
// rl= (Rectangle*) Storage::Alloc(1000);
memcpy(rl, nrl, sizeof(Rectangle)*ns);
Freea(nrl);
} else
rl= (Rectangle*) Storage::Alloc(sizeof(Rectangle)*1);
rl[size++]= r;
bbox.Merge(r);
#else
if (size == 0) {
rl[size++]= bbox= r;
return;
}
if (r.ContainsRect(bbox)) {
size= 0;
rl[size++]= bbox= r;
return;
}
bbox.Merge(r);
for (int i= 0; i < size; i++) {
if (rl[i].ContainsRect(r))
return;
if (r.ContainsRect(rl[i])) {
rl[i]= r;
return;
}
if (r.Intersects(rl[i])) {
rl[i].Merge(r);
return;
}
}
if (size >= 20)
rl[size-1].Merge(r);
else
rl[size++]= r;
#endif
}